package 每日一题;

public class No7整数反转 {

    /**
     * 给你一个 32 位的有符号整数 x ，返回将 x 中的数字部分反转后的结果。
     * 如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ，就返回 0。
     * 假设环境不允许存储 64 位整数（有符号或无符号）。
     *  
     * 示例 1：
     * 输入：x = 123
     * 输出：321
     * 示例 2：
     * 输入：x = -123
     * 输出：-321
     * 示例 3：
     * 输入：x = 120
     * 输出：21
     * 示例 4：
     * 输入：x = 0
     * 输出：0
     *  
     * 提示：
     * -231 <= x <= 231 - 1
     */

    public int reverse(int x) {

        if(x==0){
            return 0;
        }

        String strNum=String.valueOf(x);
        if(x<0){
            strNum=strNum.substring(1);//左闭右开
        }

        char[] arr = strNum.toCharArray();
        int[] numArr=new int[arr.length];
        for (int i = arr.length-1; i >= 0; i--) {
            /**
             * 可以继续优化,即不用num数组,可以使用 %求余 来获取最低位
             */
            numArr[i]=arr[arr.length-1-i]-'0';
        }

        //然后开始翻转,每层乘10
        int result=-numArr[0];
        for (int i = 1; i < numArr.length; i++) {

            //反向比对
            //使用MAX正数当遇到负数MIN的情况会出错,那么我们就直接使用MIN
            if(((Integer.MIN_VALUE+numArr[i])/10)<=result){
                //可行
                result*=10;
                result-=numArr[i];
            }else{
                //不可行,正数溢出
                return 0;
            }

        }

        if(x<0&&result==Integer.MIN_VALUE){
            //正数溢出
            return 0;
        }

        return x<0?result:-result;
    }

    public static void main(String[] args) {
        No7整数反转 n=new No7整数反转();
        int result = n.reverse(100);
        System.out.println(result);
    }

}
